#include <iostream>
#include <queue>
using namespace std;
bool compare(int i, int j){
    return i < j;
}
struct point{
    int x, y;
    point(int a, int b){
        x = a;
        y = b;
    }
    // //运算符重载，支持比较
    // bool operator<(point& a){
    //     return x < a.x;  
    // }
};
ostream &operator<<(ostream &out, const point& p){
    out<<p.x<<","<<p.y<<endl;
    return out;
}
//仿函数 定义比较规则
struct comparator1{
    bool operator()(const point& a, const point& b){
        return a.x < b.x; 
    }
};
int main(){
    priority_queue<int> maxHeap;    //默认大顶堆
    for(int i = 0; i < 10; i++){
        maxHeap.push(i + 1);
    }
    for(int i = 0; i < 10; i++){
        cout<<maxHeap.top()<<endl;
        maxHeap.pop();
    }
    cout<<"\n-----------------"<<endl;
    /*
    greater和less是std实现的两个仿函数
    就是使一个类的使用看上去像一个函数。
    其实现就是类中实现一个operator()，这个类就有了类似函数的行为，就是一个仿函数类了
    */
    priority_queue<int, vector<int>, greater<int>> minHeap; //小顶堆
    for(int i = 0; i < 10; i++){
        minHeap.push(i + 1);
    }
    for(int i = 0; i < 10; i++){
        cout<<minHeap.top()<<endl;
        minHeap.pop();
    }
    cout<<"\n-----------------"<<endl;

    /* 自定义比较规则 */
    priority_queue<point, vector<point>, comparator1> Q;    //comparator1 定义了比较规则
    for(int i = 0 ; i < 10; i++){
        Q.push(point(i + 1, i + 1));
    }
    for(int i = 0; i < 10; i++){
        cout<<Q.top()<<" ";
        Q.pop();
    }
    cout<<endl;
    return 0;
}